package com.bruce.asurada.sso.util;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * 服务健康检查工具
 * @author Bruce
 */
@Slf4j
@Component
public class ServiceHealthChecker {

    @Autowired
    private DiscoveryClient discoveryClient;

    /**
     * 检查服务是否可用
     * @param serviceName 服务名称
     * @return 是否可用
     */
    public boolean isServiceAvailable(String serviceName) {
        try {
            List<ServiceInstance> instances = discoveryClient.getInstances(serviceName);
            if (instances == null || instances.isEmpty()) {
                log.warn("服务 {} 没有可用实例", serviceName);
                return false;
            }

            log.info("服务 {} 有 {} 个可用实例", serviceName, instances.size());
            for (ServiceInstance instance : instances) {
                log.info("实例详情: {}:{}, 健康状态: {}", 
                        instance.getHost(), instance.getPort(), 
                        instance.getMetadata().getOrDefault("healthy", "unknown"));
            }
            return true;
        } catch (Exception e) {
            log.error("检查服务 {} 可用性时发生异常: {}", serviceName, e.getMessage());
            return false;
        }
    }

    /**
     * 获取服务实例列表
     * @param serviceName 服务名称
     * @return 实例列表
     */
    public List<ServiceInstance> getServiceInstances(String serviceName) {
        try {
            return discoveryClient.getInstances(serviceName);
        } catch (Exception e) {
            log.error("获取服务 {} 实例列表时发生异常: {}", serviceName, e.getMessage());
            return null;
        }
    }

    /**
     * 记录服务调用失败的详细信息
     * @param serviceName 服务名称
     * @param methodName 方法名称
     * @param statusCode 状态码
     * @param errorMessage 错误信息
     */
    public void logServiceCallFailure(String serviceName, String methodName, int statusCode, String errorMessage) {
        log.error("=== 服务调用失败详情 ===");
        log.error("服务名称: {}", serviceName);
        log.error("调用方法: {}", methodName);
        log.error("状态码: {}", statusCode);
        log.error("错误信息: {}", errorMessage);
        
        // 检查服务可用性
        boolean available = isServiceAvailable(serviceName);
        log.error("服务可用性: {}", available ? "可用" : "不可用");
        
        // 根据状态码给出建议
        switch (statusCode) {
            case 502:
                log.error("建议: 502 Bad Gateway - 检查目标服务是否正常启动，网关配置是否正确");
                break;
            case 503:
                log.error("建议: 503 Service Unavailable - 服务暂时不可用，可能正在重启或过载");
                break;
            case 504:
                log.error("建议: 504 Gateway Timeout - 服务响应超时，检查网络连接和服务性能");
                break;
            default:
                log.error("建议: 检查服务日志和网络连接");
        }
        log.error("========================");
    }
}